
package appvideo.persistencia;

import appvideo.logica.Pelicula;
import appvideo.logica.Producto;
import appvideo.logica.Proveedor;
import appvideo.logica.Tarifa;
import appvideo.logica.Videojuego;
import java.util.ArrayList;
import java.util.List;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;

public class Persistencia_Proveedores {
    
    //Me devuelve todos los proveedores de la base de datos
    public static List<Proveedor> getProveedores(){
        List<Proveedor> provs=new ArrayList();
        
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        ResultSet rs=null;
        try {
            st = con.createStatement();
            rs = st.executeQuery("Select id,nombre,fAlta,telefono,email,direccion FROM proveedores WHERE estado=1");
            
            while(rs.next()){
                Proveedor p = new Proveedor(rs.getInt("id"),rs.getString("nombre"),rs.getString("email"),rs.getString("direccion"),rs.getInt("telefono"),rs.getDate("fAlta"));
                provs.add(p);
            }
            
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        } catch(Exception e){
            System.out.println(e.getMessage());
        }
        finally{
            try {
                rs.close();
                st.close();
                con.close();
            } catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }  catch(Exception e){
                System.out.println(e.getMessage());
            } 
        }
        
        
        return provs;
    }
    
    //Devuelve un proveedor o nulo si no existe
    public static Proveedor buscaProveedor(int cod_prov){
        Proveedor p=null;

        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        ResultSet rs=null;

        try{
            st = con.createStatement();
            //Atencion: Devuelve el proveedor del codigo(id) introducido
            rs = st.executeQuery("Select id,nombre,fAlta,telefono,email,direccion FROM proveedores WHERE id="+cod_prov+" AND estado=1");
            if(rs.next()){
                p = new Proveedor(rs.getInt("id"),rs.getString("nombre"),rs.getString("email"),rs.getString("direccion"),rs.getInt("telefono"),rs.getDate("fAlta"));
            }
        }catch (SQLException sqlex) {
            System.out.println(sqlex.getMessage());
        } catch(Exception ex){
            System.out.println(ex.getMessage());
        }finally{
            try {
                rs.close();
                st.close();
                con.close();
            }catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }catch(Exception ex){
                System.out.println(ex.getMessage());
            } 
        }

            return p;
    }    
    
    //Inserta o actualiza a un proveedor de la base de datos
    public static boolean altaProveedor(Proveedor p){
        boolean ret=false;
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        ResultSet rs=null;
        try {
                st=con.createStatement();
                //Comprobar si proveedor esta en la base de datos
                rs = st.executeQuery("SELECT COUNT(0) FROM proveedores "
                        + "WHERE proveedores.nombre = '"+p.getNombre()+"'"); 
                rs.next();
                if(rs.getInt(1)==1){
                    //El proveedor estaba dado de alta en la base de datos.
                    //HACER UPDATE DEL PROVEEDOR
                    st.executeUpdate("UPDATE proveedores SET estado = 1 WHERE proveedores.nombre = '"+p.getNombre()+"'");
                    ret = true;
                }else if(rs.getInt(1)==0){
                    //El proveedor no existe en la base de datos
                    //HACER INSERCION DEL PROVEEDOR
                    SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
                    
                    st.executeUpdate("INSERT INTO proveedores (nombre,fAlta,telefono,email,direccion,estado) "
                            + "VALUES ('"+p.getNombre()+"','"+dt.format(p.getfAlta())+"',"+p.getTlf()+",'"+p.getEmail()+"','"+p.getDireccion()+"',1)");
                 
                    ret = true;
                }else if(rs.getInt(2)==0){
                    System.out.println("Atencion, hay dos proveedores con el mismo nombre en la BD");
                }
                
            } catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            } finally {
                try {
                    rs.close();
                    st.close();
                    con.close();
                }catch (SQLException sqlex) {
                    System.out.println(sqlex.getMessage());
                }catch(Exception ex){
                    System.out.println(ex.getMessage());
                }
            }
            
        
        return ret;
    }
    
    //Da de baja a un proveedor en la base de datos(cambia su estado a 2)
    public static boolean bajaProveedor(Proveedor p){
        boolean ret=false;
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        ResultSet rs=null;
       
        try {
            st = con.createStatement();
            //Comprobar si proveedor esta en la base de datos
            rs = st.executeQuery("SELECT COUNT(0) FROM proveedores "
                    + "WHERE proveedores.id = "+p.getId()+""); 
            rs.next();
            if(rs.getInt(1)==1){
                //Si existe un proveedor en la base de datos->Dale de baja
                st.executeUpdate("UPDATE proveedores SET estado = 2 WHERE proveedores.id="+p.getId()+"");
                ret=true;
            }
                
        } catch (SQLException sqlex) {
            System.out.println(sqlex.getMessage());
        } catch (Exception ex){
            System.out.println(ex.getMessage());
        } finally {
            try {
                rs.close();
                st.close();
                con.close();
            }catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }catch(Exception ex){
                System.out.println(ex.getMessage());
            }
        }
        return ret;
    }
    
    public static boolean modificaProveedor(Proveedor p){
        boolean ret=false;
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        ResultSet rs=null;
        
        try {
            st = con.createStatement();
            //Comprobar si proveedor esta en la base de datos
            rs = st.executeQuery("SELECT COUNT(0) FROM proveedores "
                    + "WHERE proveedores.id = "+p.getId()+""); 
            rs.next();
            if(rs.getInt(1)==1){
                SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
                //Si existe un proveedor en la base de datos->Dale de baja
                st.executeUpdate("UPDATE proveedores "
                        + "SET nombre='"+p.getNombre()+"', fAlta='"+dt.format(p.getfAlta())+"', telefono="+p.getTlf()+",email='"+p.getEmail()+"',direccion='"+p.getDireccion()
                        + "' WHERE proveedores.id="+p.getId()+"");
                ret=true;
            }
            
        }catch (SQLException sqlex) {
            System.out.println(sqlex.getMessage());
        } finally {
            try {
                rs.close();
                st.close();
                con.close();
            }catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }catch(Exception ex){
                System.out.println(ex.getMessage());
            }
        }
        return ret;
    }
   
    
    public static List<Producto> getArticulosProveedor(Proveedor prov){
        List<Producto> productos=new ArrayList();
        
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        ResultSet rs=null;
        
        try {
            st = con.createStatement();
            //SELECCION DE TODOS LOS VIDEOJUEGOS DEL PROVEEDOR DADO
            String query = "SELECT codigo, videojuegos.nombre, id_prov, fCompra, genero, plataforma, id_tarifa, tarifas.nombre, precio FROM "
                    + "videojuegos INNER JOIN tarifas ON videojuegos.id_tarifa = tarifas.id WHERE id_prov ="+prov.getId();
            rs = st.executeQuery(query);
            //AÑADE LOS VIDEOJUEGOS DEL PROVEEDOR DADO A LA LISTA DE PRODUCTOS
            while(rs.next()){
                Tarifa t = new Tarifa(rs.getString("tarifas.nombre"),rs.getDouble("precio"),rs.getInt("id_tarifa"));
                productos.add(
                    new Videojuego(rs.getInt("codigo"),rs.getString("nombre"),prov,rs.getDate("fCompra"),t,rs.getString("genero"),rs.getString("plataforma"))
                        );
            }
            //SELECCION DE PELICULAS DEL PROVEEDOR DADO
            query = "SELECT codigo, peliculas.nombre, id_prov, fCompra, genero, formato, duracion, id_tarifa, tarifas.nombre, precio FROM "
                    + "peliculas INNER JOIN tarifas ON peliculas.id_tarifa = tarifas.id WHERE id_prov ="+prov.getId()+"";
            rs = st.executeQuery(query);
            while(rs.next()){
                Tarifa t = new Tarifa(rs.getString("tarifas.nombre"),rs.getDouble("precio"),rs.getInt("id_tarifa"));
                productos.add(
                    new Pelicula(rs.getInt("codigo"),rs.getString("nombre"),prov,rs.getDate("fCompra"),t,rs.getString("genero"),rs.getString("formato"),rs.getInt("duracion"))
                        );
            }
            
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        } finally {
            try {
                rs.close();
                st.close();
                con.close();
            }catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }catch(Exception ex){
                System.out.println(ex.getMessage());
            }
        }
        return productos;
    }
}


